#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

#define LEFT    30000000
#define RIGHT   30000200
#define N 		3

int main()
{
	printf("[%d]-begin!\n", getpid());
	/*
	 * 刷新缓冲区，否则子进程会拷贝一份缓冲区，导致两份缓存
	 * 
	 * ！！！fflush操作非常重要！！！
	 * 
	 * */
	fflush(NULL);

	int i, j, n, mark;
    pid_t pid;

	// fork三个子进程，使用交叉分配的方式去处理数据
    for (n = 0; n <= N; n++) {
        pid = fork();
        if (pid < 0) {
            perror("fork()");
            exit(1);
        } else if (pid == 0) {   //child
            for(i = LEFT+n; i <= RIGHT; i+=N){
				mark = 1;
            	for (j = 2; j < i/2; j++) {
                	if (i % j == 0) {
                    	mark = 0;
                    	break;
                	}
            	} 
            	if (mark)
                	printf("[%d], %d is a primer\n", n, i);
			}
			// 父进程如果已经退出，则创建出来的子进程就会被init进程接管
	        //sleep(1000);
			// 当子进程工作结束以后，需要对其进行exit，否则，子进程是拷贝的父进程，同样会进行再创建子进程的子进程
            exit(0);
        }
    }

	int st;
    for (i = 0; i < N; i++) {
		// 回收子线程，wait使用的是阻塞的方式，st用于获取回收的结果
		wait(&st);		
		//wait(NULL);
	}
	// 父进程结束，子进程就会被init进程接管
    //sleep(1000);	
	printf("[%d]-end!\n", getpid());

	exit(0);
}
